package com.哈希表;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 判断一个 9x9 的数独是否有效。只需要根据以下规则，验证已经填入的数字是否有效即可。
 *
 * 数字 1-9 在每一行只能出现一次。
 * 数字 1-9 在每一列只能出现一次。
 * 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
 *
 *
 * 上图是一个部分填充的有效的数独。
 *
 * 数独部分空格内已填入了数字，空白格用 '.' 表示。
 */
public class 有效的数独 {
    static class Solution {
        public   boolean isValidSudoku(char[][] board) {
            Map<Character ,Integer> map = new HashMap<>();
            //坚列
           for(int i = 0;i<9;i++){
               for(int j = 0 ;j<9;j++){
                   if(board[i][j] ==  '.'){
                       continue;
                   }
                   map.put(board[i][j],map.getOrDefault(board[i][j],0)+1);
               }
               if(!checkColumn(map)){
                   return false;
               }
               map.clear();;
           }

            Map<Character,Integer> map2 = new HashMap<>();
            //横列
            for(int i = 0 ;i<9;i++){
                for(int j = 0;j<9;j++){
                    if(board[j][i] ==  '.'){
                        continue;
                    }
                    map2.put(board[j][i],map2.getOrDefault(board[j][i],0)+1);
                }
                if(!checkColumn(map2)){
                    return false;
                }
                map2.clear();;
            }
            Map<Character,Integer> map3 = new HashMap<>();
           for(int i = 0;i<9;i+=3){
               for(int j = 0;j<9;j+=3){
                   for(int x = i;x<i+3;x++){
                       for(int y=j;y<j+3;y++){
                           if(board[x][y] == '.'){
                               continue;
                           }
                           map3.put(board[x][y],map3.getOrDefault(board[x][y],0)+1);
                       }
                   }
                   if(!checkColumn(map3)){
                       return false;
                   }
                   map3.clear();
               }

           }
            return true;
        }

        public  boolean checkColumn(Map<Character,Integer> map){

            Iterator<Integer> iterator = map.values().iterator();
            while (iterator.hasNext()){
                if(iterator.next()>1){
                    return  false;
                }
            }
            return true;
        }
        public static void main(String[] args) {
            char[][] chars = new char[][]{
                    {'.','.','.',  '9','.','.',  '.','.','.'},
                    {'.','.','.',  '.','.','.',  '.','.','.'},
                    {'.','.','3',  '.','.','.',  '.','.','1'},

                    {'.','.','.','.','.','.','.','.','.'},
                    {'1','.','.','.','.','.','3','.','.'},
                    {'.','.','.','.','2','.','6','.','.'},
                    {'.','9','.','.','.','.','.','7','.'},
                    {'.','.','.','.','.','.','.','.','.'},
                    {'9','.','.','9','.','.','.','.','.'}
            };
            Solution solution = new Solution();
            System.out.println(solution.isValidSudoku(chars));

        }
    }




}
